package com.xbongbong.saas.model;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.xbongbong.aiassistant.domain.entity.AiProductEntity;
import com.xbongbong.paas.domain.entity.ext.PaasFormDataEntityExt;
import com.xbongbong.paas.enums.DelEnum;
import com.xbongbong.paas.field.FieldAttrEntity;
import com.xbongbong.paas.field.UnitItemPoJo;
import com.xbongbong.paas.toolbox.exception.XbbException;
import com.xbongbong.paas.toolbox.wrap.IModel;
import com.xbongbong.pro.businessdata.pojo.dto.FormatExplainDTO;
import com.xbongbong.pro.domain.entity.UpdateDataEntity;
import com.xbongbong.pro.form.pojo.dto.ChildProductDTO;
import com.xbongbong.pro.formdata.pojo.dto.SaasAnalysisDataDTO;
import com.xbongbong.pro.product.pojo.dto.FilterAttrOnOffJXCDTO;
import com.xbongbong.pro.product.pojo.vo.FilterAttrOnOffJXCVO;
import com.xbongbong.pro.statistic.pojo.vo.ProductInfoVO;
import com.xbongbong.saas.domain.entity.ProductStockUpdateEntity;
import com.xbongbong.saas.domain.entity.ext.ProductEntityExt;
import com.xbongbong.sys.domain.entity.PriceProductSetEntity;
import org.elasticsearch.action.support.WriteRequest;

import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * ProductModel
 *
 * @author GuoJun.HU
 * @since V1.0
 * @date 2019/2/19 10:47
 */
public interface ProductModel extends IModel<ProductEntityExt> {

    /**
     * 批量插入
     *
     * @param productList 数据列表
     * @author GuoJun.HU
     * @since V1.0
     * @return Integer
     * @date 2019/6/10 19:47
     */
    Integer insertBatch(List<ProductEntityExt> productList) throws XbbException;

    /**
     * 保存
     *
     * @param entity 数据实体 
     * @author GuoJun.HU 
     * @since V1.0
     * @return Integer
     * @date 2019/2/19 10:19 
     */
    Integer save(ProductEntityExt entity) throws XbbException;

    /**
     * 删除
     *
     * @param key       主键
     * @param corpid    公司id
     * @author GuoJun.HU
     * @since V1.0
     * @return Integer
     * @date 2019/2/19 10:19 
     */
    Integer deleteByKey(Long key, String corpid) throws XbbException;

    /**
     * 通过主键获取
     *
     * @param key    主键
     * @param corpid 公司id
     * @return Integer
     * @author GuoJun.HU
     * @date 2019/2/18 22:07
     * @since V1.0
     */
    ProductEntityExt getByKey(Long key, String corpid);
    /**
     * 获取符合查询条件的记录
     *
     * @param param 查询条件
     * @return 符合查询条件的记录
     * @return Integer
     * @author GuoJun.HU
     * @date 2019/2/18 22:07
     * @since V1.0
     */
    @Override
    List<ProductEntityExt> findEntitys(Map<String, Object> param);
    /**
     * 获取符合查询条件的记录
     *
     * @param param 查询条件
     * @return 符合查询条件的记录
     * @return Integer
     * @author GuoJun.HU
     * @date 2019/2/18 22:07
     * @since V1.0
     */
    List<PaasFormDataEntityExt> findEntitysByPaas(Map<String, Object> param);

    /**
     * 过滤产品规格中 规格名称和规格值里面的双引号
     *
     * @param spec 要过滤的规格
     * @author GuoJun.HU
     * @date 2018/1/27 19:00
     * @return String
     */
    String filterProductSpecDoubleQuotes(String spec);
    /**
     * 过滤产品规格中 规格名称和规格值里面的双引号(用于数组)
     *
     * @param spec 要过滤的规格
     * @author JYH
     * @date 2019/11/25 15:25
     * @return String
     */
    String filterProductSpecDoubleQuotesWithArray(String spec);
    /**
     * 通过id列表获取产品并构建id和entity的对应关系
     *
     * @param corpid        公司id
     * @param productIdIn   产品id列表
     * @param del           删除标志
     * @author Jian.Wang
     * @date  2018/2/21 17:26
     */
    Map<Long,ProductEntityExt> getProductMapByIdIn(String corpid, List<Long> productIdIn, Integer del);

    /**
     * 通过id列表获取产品并构建id和entity的对应关系
     *
     * @param corpid        公司id
     * @param productIdIn   产品id列表
     * @param del           删除标志
     * @param fieldList
     * @author Jian.Wang
     * @date  2018/2/21 17:26
     */
    Map<Long, ProductEntityExt> getProductMapByIds(String corpid, List<Long> productIdIn, Integer del, List<String> fieldList) throws XbbException;

    /**
     * 构建产品id和entity的对应关系
     *
     * @param products 产品列表（从es查询出的产品列表）--改为传入产品list，而不是产品id。这样在封装父子产品关系map时，就能和该方法就可以共用一份获取产品方法，省一次查询
     * @return java.util.Map<java.lang.Long   ,   com.xbongbong.pro.statistic.pojo.vo.ProductInfoVO>
     * @throws XbbException
     * @author zcp
     * @date 2019/4/8 20:26
     * @version v1.0
     * @since v1.0
     */
    Map<Long, ProductInfoVO> getProductMapByIdIn4Es(List<ProductInfoVO> products) throws XbbException;

    /**
     * 通过子产品id列表构建子产品和父产品的对应关系
     *
     * @param corpid   公司id
     * @param products 产品列表（从es查询出的产品列表）--改为传入产品list，而不是产品id。这样在封装产品id和实体map集合和该方法就可以共用一份获取产品方法，省一次查询
     * @param del      删除标志
     * @return java.util.Map<java.lang.Long   ,   com.xbongbong.pro.statistic.pojo.vo.ProductInfoVO> 产品id--父产品信息
     * @throws XbbException
     * @author GuoJun.HU
     * @update 2019/4/8 从saas移入 by zcp
     * @since 3.21
     * 创建时间 2018/5/3 11:07
     */
    Map<Long, ProductInfoVO> getParentProductListByIdIn4Es(String corpid, List<ProductInfoVO> products, Integer del) throws XbbException;

    /**
     * 通过id列表获取产品
     *
     * @param corpid        公司id
     * @param productIdIn   产品id列表
     * @param del           删除标志
     * @author Jian.Wang
     * @date  2018/2/21 17:26
     */
    List<ProductEntityExt> getProductListByIdIn(String corpid, List<Long> productIdIn, Integer del);
    /**
     * 通过id列表获取产品
     *
     * @param corpid        公司id
     * @param productIdIn   产品id列表
     * @param del           删除标志
     * @author Jian.Wang
     * @date  2018/2/21 17:26
     */
    List<ProductEntityExt> getProductListByIds(String corpid, List<Long> productIdIn, Integer del, List<String> fieldList) throws XbbException;

    /**
     * 通过产品id集合和模糊搜索的产品名称去查询符合条件的id集合(购物车列表用到)
     * @param corpid      公司id
     * @param productIdIn 产品id列表
     * @param del         删除标志
     * @param fieldList   查询的属性
     * @param productName 商品名称
     * @throws XbbException
     * @author weiming
     * @date 2021-02-22 13:59
     */
    List<Long> getProductIds(String corpid, List<Long> productIdIn, Integer del, List<String> fieldList, String productName) throws XbbException;

    /**
     * 通过id列表获取产品
     *
     * @param corpid        公司id
     * @param productIdIn   产品id列表
     * @param del           删除标志
     * @author weiming
     * @date  2020/12/29 10:29
     */
    List<PaasFormDataEntityExt> getProductsByIds(String corpid, List<Long> productIdIn, Integer del, List<String> fieldList, String productName) throws XbbException;
    /**
     * 通过id列表获取产品
     * 重载getProductListByIdIn方法，用es方式查询
     * @param corpid        公司id
     * @param productIdIn   产品id列表
     * @param del           删除标志
     * @return java.util.List<com.xbongbong.pro.statistic.pojo.vo.ProductInfoVO>
     * @throws XbbException
     * @author zcp
     * @date 2019/4/8 18:52
     * @since v1.0
     * @version v1.0
     */
    List<ProductInfoVO> getProductListByIdInEs(String corpid, Collection<Long> productIdIn, Integer del) throws XbbException;

    /**
     * 批量删除
     * @author 吴峰
     * @date 2019/2/27 21:52
     * @param list id列表
     * @param corpid 公司id
     * @param del   删除标志
     * @return Integer
     * @throws XbbException XbbException
     */
    Integer deleteBatch(List<Long> list, String corpid, Integer del) throws XbbException;

    /**
     * 根据产品idIn获取对应的子产品和父产品的map集合
     * @param corpid 公司id
     * @param idIn 产品id集合
     * @param fieldList 需要查询的数据
     * @author lcx
     * @return 子产品和父产品的map集合，key=productMap时，value是子产品集合；key=parentProductMap时，value是父产品集合
     * @throws XbbException XbbException
     * @date 2019/2/27 21:52
     */
    Map<String, Map<Long, ProductEntityExt>> getProductWithParentMapByIdIn(String corpid, List<Long> idIn, List<String> fieldList) throws XbbException;

    /**
     * 批量更新
     * @author 吴峰
     * @date 2019/3/2 11:45
     * @param valueList 数据列表
     * @param corpid 公司id
     * @return java.lang.Integer
     * @throws XbbException 业务异常
     */
    Integer updateBatch(List<UpdateDataEntity> valueList, String corpid) throws XbbException;

    Integer updateBatchImmediately(List<UpdateDataEntity> valueList, String corpid) throws XbbException;

    Integer updateBatch(List<UpdateDataEntity> valueList, String corpid, WriteRequest.RefreshPolicy refreshPolicy) throws XbbException;

    /**
     * 通过产品单位的value值获取单位的text
     * @author lcx
     * @date 2019/3/2 11:45
     * @param unitKey 产品单位的key值
     * @param fieldAttrEntity 字段解释实体
     * @throws XbbException 业务异常
     */
    String getProductUnitTextByValue(String unitKey, FieldAttrEntity fieldAttrEntity) throws XbbException;

    /**
     * 获取智能助手需要的产品数据
     *
     * @param corpid 公司id
     * @param idIn 数据ids
     * @return
     * @throws
     * @author hongxiao
     * @date: 2020-02-24 16:54
     * @since v4.13.0
     * @version v4.13.0
     */
    List<AiProductEntity> getProductList4Ai(String corpid, List<Long> idIn);

    Integer updateBatchSerialNo(List<UpdateDataEntity> list) throws XbbException;

    /**
     * 不刷es数据的方法，甚用
     * @param valueList
     * @param corpid
     * @return
     * @throws XbbException
     */
    Integer updateBatch4JobNoEs(List<UpdateDataEntity> valueList, String corpid) throws XbbException;

    List<String> getCorpidList();

    /**
     * 产品库存更新
     * @param keySet
     * @param values
     * @param corpid
     */
    void updateStockDB(Set<Long> keySet, Collection<ProductStockUpdateEntity> values, String corpid);

    void updateWarehouse(Set<Long> keySet, Map<Long, JSONObject> warehouseIdMap, String corpid);

    void insertBatchFix(List<ProductEntityExt> productList, boolean dbInsert) throws XbbException;


    /**
     * 获取原父产品下的子产品，从es获取
     *
     * @param childProductDTO
     * @author chaoxiong.lei
     * @Date 21:29 2019/2/14
     * @since v1.0
     **/
    List<PaasFormDataEntityExt> getChildProductSimpleList(ChildProductDTO childProductDTO) throws XbbException;

    /**
     * 编辑时格式化解释
     *
     * @param formatExplainDTO 入参
     * @throws XbbException 异常
     * @author long.rao
     * @date 2019-02-13 20:53
     */
    void formatUpdateExplain(FormatExplainDTO formatExplainDTO, JSONObject data) throws XbbException;

    FilterAttrOnOffJXCVO filterAttrOnOffJXC(FilterAttrOnOffJXCDTO filterAttrOnOffJXCDTO) throws XbbException;

    String getPriceOrCostRegion(List<PaasFormDataEntityExt> childProductList, String attr, Integer accuracy) throws XbbException;

    JSONArray formatMultiPrice(List<UnitItemPoJo> unitItemPoJos, JSONArray price);

    /**
     * 编辑格式化数据格式
     *
     * @param saasAnalysisDataDTO saas编辑数据
     * @throws XbbException 参数格式错误异常
     * @param result 要返回的jsonobject
     * @author chaoxiong.lei
     * @date 19:08 2019/1/20
     * @since v1.0
     **/
    void formatData(SaasAnalysisDataDTO saasAnalysisDataDTO, JSONObject result) throws XbbException;

    Map<Long, ProductEntityExt> getProductMap(String corpid, JSONArray productArray);

    Map<Long, ProductEntityExt> getProductMap(Set<Long> productIdList, String corpid, JSONArray productArray);

    Map<String, PriceProductSetEntity> getPriceMap(String corpid, Long refId, Long formId, List<Long> productIdIn, Map<Long, Boolean> multiUnitMap) throws XbbException;

    List<PaasFormDataEntityExt> getProductListById(Set<Long> productIds, String corpid, DelEnum delEnum) throws XbbException;

    void updateProductCostByid(List<ProductEntityExt> productEntityExtList , String corpid);

    List<ProductEntityExt> getCostIsNullProduct(String corpid);

    /**
     * 无子表单的产品保存，子产品使用
     * @param productEntityExt
     * @return
     * @throws XbbException
     */
    Integer saveNoSubForm(ProductEntityExt productEntityExt) throws XbbException;

    /**
     * 无子表单的产品插入，子产品使用
     * @param productEntityExt
     * @return
     * @throws XbbException
     */
    Integer insertNoSubForm(ProductEntityExt productEntityExt) throws XbbException;

    /**
     * 无子表单的产品更新，子产品使用
     * @param productEntityExt
     * @return
     * @throws XbbException
     */
    Integer updateNoSubForm(ProductEntityExt productEntityExt) throws XbbException;

    /**
     * 获取子产品以及规格
     * @param productIdSet
     * @param corpid
     * @return
     * @throws XbbException
     */
    Map<Long, PaasFormDataEntityExt> getProductSpecificationMap(Collection productIdSet, String corpid) throws XbbException;

    List<PaasFormDataEntityExt> getChildProductList(ChildProductDTO childProductDTO) throws XbbException;

    Long getParentDataId(Long dataId, Integer businessType, String corpid) ;
}
